// Kony


#include "UI/WidgetController/AttributeMenuWidgetController.h"

#include "AbilitySystem/BaseAbilitySystemComponent.h"
#include "AbilitySystem/BaseAttributeSet.h"
#include "AbilitySystem/Data/AttributeInfo.h"
#include "Player/BasePlayerState.h"

void UAttributeMenuWidgetController::BindCallbacksToDependencies()
{
	//属性集
	check(AttributeInfo)
	//循环获取 并设置 所有属性的变化委托
	//用于监听属性变化 ,当属性变化时，会触发Lambda表达式获取数据 然后读取出对应改变的数据 更改页面
	for (auto&Pair: GetBaseAS()->TagsToAttributes)
	{
		AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(Pair.Value())
		.AddLambda([this,Pair](const FOnAttributeChangeData& Data)
		{
			BroadcastAttributeInfo(Pair.Key,Pair.Value());
		});
	}
	//获取用户状态 读取等级相关数据
	GetBasePS()->OnAttributePointsChangedDelegate.AddLambda([this](int32 Points)
	{
		//广播属性点变更
		AttributePointsChanged.Broadcast(Points);
	});
	
}

void UAttributeMenuWidgetController::BroadcastInitializeValues()
{
	//属性集
	check(AttributeInfo)
	//从游戏标签单例中获取游戏标签
	//这里是循环获取 UBaseAttributeSet 广播来的游戏属性 和 游戏标签对比后 广播到个人属性菜单界面UI
    for (auto&Pair: GetBaseAS()->TagsToAttributes)
	{
    	BroadcastAttributeInfo(Pair.Key,Pair.Value());
	}
	//广播属性点变更
	AttributePointsChanged.Broadcast(GetBasePS()->GetAttributePoints());
}
//升级属性函数，调用能力系统组件执行升级属性操作
void UAttributeMenuWidgetController::UpgradeAttribute(const FGameplayTag& AttributeTag)
{
	//能力系统组件
	GetBaseASC()->UpgradeAttribute(AttributeTag);
}

void UAttributeMenuWidgetController::BroadcastAttributeInfo(const FGameplayTag& AttributeTag,const FGameplayAttribute& Attribute) const
{
	//从广播委托中获取游戏标签对应的游戏属性
	FBaseAttributeInfo Info = AttributeInfo->FindAttributeInfoForTag(AttributeTag);
	//获取到对应的属性数值
	Info.AttributeValue = Attribute.GetNumericValue(AttributeSet);
	AttributeInfoDelegate.Broadcast(Info);
}
